﻿#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<string.h>
#include<assert.h>
//strlen模拟实现

////递归实现
//int mn_strlen2( const char* s) {
//	assert(s);
//	if (*s=='\0')
//		return 0;
//	else
//	return 1 + mn_strlen2(s+1);
//}
////地址相减
//int mn_strlen3(const char* s) {
//	assert(s);
//	char* p = s;
//	while (*p)
//	p++	;
//	return p - s;
//}
// 
// //方式1-计数器
//size_t mn_strlen1(const char* s) {
//	//我们不希望改变字符串 所以用const修饰，s用来接收首地址
//	int i = 0;//计数器
//	assert(s);
//	while (*s) {//当*s为'\0'时打破循环
//		i++;
//		s++;//字符地址++
//	}
//	return i;//返回
//}
//int main() {
//	char a[] = "abcdef";
//	size_t len1 = mn_strlen1(a);
//	printf("%zd\n", len1);
//	return 0;
//}

//strcpy模拟实现
//char* mn_strcpy(char* p1, const char* p2) {
//	//我们不希望改变字符串p2 所以用const修饰,p1为目标空间的首地址，p2为源字符串
//	assert(p1);//防止为NULL
//	assert(p2);
//	char* p = p1;//保存目标空间首地址
//	while (*p1=*p2) {//解引用将*p2的字符赋给*p1
//		p1++;//地址加加
//		p2++;
//	}
//	return p;//返回目标空间首地址
// }
//int main() {
//	char a[20] = { 0 };
//	char b[] = "abcdef";
//char*p=mn_strcpy(a, b);
//	printf("%s\n", p);
//	return 0;
//}
//strncpy
//int main() {
//	char a[20] = {0};
//	char b[] = "abcde";
//	printf("%s\n", strncpy(a, b,3));//只拷贝三个
//	return 0;
//}

// 
//strcat模拟
//char* nm_strcat(char* p1, const char* p2) {
//	我们不希望改变字符串p2 所以用const修饰,p1为目标空间的首地址，p2为源字符串
//	char* p = p1;//保存目标空间首地址
//	assert(p1);
//	assert(p2);
//		while (*p1)//遍历*p直到找到‘/0’
//			p1++;
//		while (*p1=*p2) {///解引用将*p2的字符赋给*p1
//		p1++;
//		p2++;
//	}
//	return p;//返回目标空间首地址
//}
//int main() {
//	char a[20] ="grr";
//	char b[] = "abcdef";
//	char*p=nm_strcat(a, b);
//	printf("%s\n", p);
//	return 0;
//}
//strncat
//int main() {
//	char a[20] = "xxx";
//	char b[] = "abcde";
//	printf("%s\n", strncat(a, b,3));
//
//	return 0;
//}

//strcmp模拟
//int mn_strcmp(const char* p1, const char* p2) {
//	//	我们不希望改变字符串p2 和p1所以用const修饰,p1为目标空间的首地址，p2为源字符串的首地址
//	assert(p1);//防止为NULL
//	assert(p2);
//	while (*p1 == *p2) {//相等就继续比较
//		if (*p1 == '\0')//当双方都是\0时就是两字符串相等
//			return 0;
//		p1++;
//		p2++;
//	}
//	return *p1 - *p2;//p1>pp2时返回正值，否则反之
//}
//int main() {
//	char* a = "ger";
//	char* b = "ger";
//	int t = mn_strcmp(a, b);
//	if (t == 0)
//		printf("a=b");
//	else if (t > 0)
//		printf("a>b");
//	else
//		printf("a<b");
//	return 0;
//}
////
//strncmp
//int main() {
//	char* a = "gerqq";
//	char* b = "gera";
//	int t = strncmp(a, b,3);//比较前三个字符
//	if (t == 0)
//		printf("a=b");
//	else if (t > 0)
//		printf("a>b");
//	else
//		printf("a<b");
//	return 0;
//}

//strstr模拟
//char* mn_strstr(const  char* p1, const char* p2) {
//	assert(p1);
//	if (!*p2)//源字符串为NILL时直接返回p1
//		return p1;
//	char* con = p1;//记录指针，从第一个位置开始
//	char* s1 = NULL;//空
//	char* s2 = NULL;//
//	while (*con) {//当将目标字符串都找一次还没有就返回NULL
//		s1 = con;//目标字符移动指针
//		s2 = p2;//源字符移动指针
//		while ((*s1 == *s2) && *s2) {//对比，当s2为'\0'时结束
//			s1++;
//			s2++;
//		}
//		if (*s2 == '\0')
//			return con;
//		con++;
//	}
//	return NULL;
//}
//
//int main() {
//	char* a = "cdf";
//	char* b = "cqf";
//	char* p = mn_strstr(a, b);
//	if (!p)
//		printf("找不到\n");
//	else
//		printf("%s\n", p);
//	return 0;
//}
//#include<ctype.h>
//#include<stdlib.h>
//int main() {
//	char a = getchar();
//	if (islower(a)) {
//		char b = toupper(a);
//		printf("%c\n", b);
//	}
//	else
//		printf("输入的不是小写字母");
//	return 0;
//}
//#include<string.h>//包含头文件
//int main() {
//	char a[] = "abcdfa";//
//	char b[] = "cd";//
//	char* p = strstr(a, b);//在a字符串中找b字符串，找到之后返回找到时在a的地址
//	printf("%s\n", p);
//	return 0;
//}

//#include <stdio.h>
//#include <string.h>
//int main()
//{
//	char arr[] = "192.168.6.111";
//	char* sep = ".";//作为分割符
//	char* str = NULL;//等会作接收返回值
//	for (str = strtok(arr, sep); str != NULL; str = strtok(NULL, sep))
//	{
//		printf("%s\n", str);
//	}
//	return 0;
//}

#include <errno.h>
#include <string.h>
#include <stdio.h>
//我们打印⼀下0~10这些错误码对应的信息
int main()
{
	int i = 0;
	for (i = 0; i <= 10; i++) {
		printf("%s\n", strerror(i));
	}
	return 0;
}